import { config } from "./config";

class WebSocket {
    static instance = null; // 静态属性，用于存储单例实例

    constructor(key) {
        if (WebSocket.instance) {
            console.warn("WebSocket 已经存在，不会重复创建");
            return WebSocket.instance;
        }

        this.ws = null;
        this.url = config.socketUrl + key;
        this.reconnectInterval = 2000; // 重连间隔，默认 2 秒
        this.maxRetries = 50; // 最大重试次数
        this.retryCount = 0; // 当前重试次数
        this.isManualClose = false; // 是否为主动关闭连接
        this.isConnected = false; // 当前连接状态
        this.messageHandlers = []; // 用于存储所有的消息处理函数
        this.connect();

        WebSocket.instance = this; // 保存当前实例到静态属性
    }

    connect() {
        if (this.ws) {
            console.warn("WebSocket 连接已经存在，无法重复连接");
            return;
        }

        this.ws = uni.connectSocket({
            url: this.url,
            complete: () => {}
        });

        this.ws.onOpen(() => {
            this.isConnected = true;
            this.retryCount = 0; // 重置重试次数
            this.isManualClose = false; // 重置主动关闭标志
            console.log("WebSocket连接已打开！");
        });

        this.ws.onMessage((message) => {
            const data = JSON.parse(message.data); // 假设服务器返回的是JSON数据
            // 调用所有注册的消息处理函数
            this.messageHandlers.forEach((handler) => handler(data));
        });

        this.ws.onError((error) => {
            console.error("WebSocket连接发生错误", error);
            // 如果不是主动关闭，尝试重新连接
            if (!this.isManualClose) {
                this.reconnect();
            }
        });

        this.ws.onClose(() => {
            console.log("WebSocket已关闭！");
            this.ws = null; // 清除连接
            if (!this.isManualClose) {
                this.reconnect(); // 如果不是主动关闭，则重新连接
            }
        });
    }

    // 注册消息处理函数
    onMessage(handler) {
        if (typeof handler === "function") {
            this.messageHandlers.push(handler);
        } else {
            console.error("onMessage 需要传入一个函数作为回调");
        }
    }

    /**
     * 主动关闭连接
     */
    close() {
        if (this.isConnected) {
            this.isManualClose = true; // 标记为主动关闭
            this.ws.close({
                success: () => {
                    console.log("关闭WebSocket连接成功！");
                }
            });
            WebSocket.instance = null; // 清除单例实例
        }
    }

    /**
     * 重新连接
     */
    reconnect() {
        this.isConnected = false;
        // 进行重连
        if (this.retryCount < this.maxRetries) {
            this.retryCount++;
            console.log(`尝试重新连接...第 ${this.retryCount} 次`);
            setTimeout(() => {
                this.connect(); // 重新连接
            }, this.reconnectInterval);
        } else {
            console.log("重连次数超过最大限制，停止重连");
        }
    }

    /**
     * 获取单例实例
     */
    static getInstance(key) {
        if (!WebSocket.instance) {
            WebSocket.instance = new WebSocket(key);
        }
        return WebSocket.instance;
    }
}

export default WebSocket;
